home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Diamond Collection / The Diamond Collection (Software Vault)(Digital Impact).ISO / cdr44 / xlib50.zip / EASYX.ASM < prev    next >
Assembly Source File  |  1995-02-11  |  17KB  |  410 lines

  1. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2. ;+                                                                             +
  3. ;+                      EASYX Version 2.0 Source Code                          +
  4. ;+                                                                             +
  5. ;+              Copyright 1993-1995, by TechniLib (TM) Company                 +
  6. ;+                          All Rights Reserved                                +
  7. ;+                                                                             +
  8. ;+                  SALE OR USE OF SOFTWARE DEVELOPED WITH                     +
  9. ;+                     UNREGISTERED COPIES OF THIS CODE                        +
  10. ;+                           INFRINGES COPYRIGHT                               +
  11. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  12. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  13. ;                         Easy Extender for DOS
  14. ;                              Version 2.0
  15. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  16.  
  17.                .MODEL         LARGE,PASCAL
  18.                .386P
  19.  
  20. TRUE           EQU            1
  21. FALSE          EQU            0
  22.  
  23. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  24. ;TASM Modifications
  25. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  26.  
  27. ;TASM users should set TASMMODE below to TRUE.
  28.  
  29. TASMMODE       =              FALSE
  30.  
  31.                IF TASMMODE
  32.                MASM51
  33.                QUIRKS
  34.                NOJUMPS
  35.  
  36. PUSHW          MACRO IMMEDIATE16:REST                       ;PUSH imm16 (for TASM compatibility)
  37.                IF (@WordSize EQ 4)
  38.                DB             66H
  39.                ENDIF
  40.                DB             68H
  41.                DW             IMMEDIATE16
  42.                ENDM
  43.  
  44. PUSHD          MACRO IMMEDIATE32:REST                       ;PUSH imm32 (for TASM compatibility)
  45.                IF (@WordSize EQ 2)
  46.                DB             66H
  47.                ENDIF
  48.                DB             68H
  49.                DD             IMMEDIATE32
  50.                ENDM
  51.  
  52.                INCLUDE        XLIBB.INC
  53.  
  54.                ELSE
  55.  
  56. ARG            TEXTEQU        <>
  57.                OPTION         PROC:PRIVATE
  58.                OPTION         NOLJMP
  59.                INCLUDE        XLIB.INC
  60.  
  61.                ENDIF
  62.  
  63. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  64. ;DSEG declaration.  The DSEG data segment has combine type 'FAR_DATA' when
  65. ;being used in a Borland library.  Under most memory models, Borland places all
  66. ;segments with combine type 'DATA' in DGROUP.  Unfortunately, the offsets seen
  67. ;by the library in such segments may have a different base than those seen by C.
  68. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  69.  
  70.                IF TASMMODE
  71. DSEG           SEGMENT PARA PUBLIC USE16 'FAR_DATA'
  72.                ELSE
  73. DSEG           SEGMENT PARA PUBLIC USE16 'DATA'
  74.                ENDIF
  75.                ASSUME DS:DSEG
  76.  
  77. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  78. ;Stacks used for MOVMEM routine.  Stacks are dynamically allocated to cover the
  79. ;possibility that MOVMEM is called both within the main thread of execution and
  80. ;in interrupt handlers.  The possibility of nested interrupts is also covered.
  81. ;Calls to MOVMEM may be nested four deep.  Each dynamically allocated stack
  82. ;contains 100H bytes.
  83. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  84.  
  85.                ALIGN          8
  86.                DB 800H DUP(0)                               ;Sufficient space for four stacks
  87. ISTKPTR        DD             OFFSET $                      ;Initial stack pointer (dynamically adjusted)
  88. STKALLOC       EQU            200H                          ;Number of bytes allocated per stack for MOVMEM
  89.  
  90. DSEG           ENDS
  91.  
  92. CSEG           SEGMENT PARA PUBLIC USE16 'CODE'
  93.                ASSUME CS:CSEG
  94.  
  95.                IF TASMMODE
  96.                SMALLSTACK
  97.                ENDIF
  98.  
  99. ;Allocate extended memory block.  Error code returned in DX:AX.  Arguments are:
  100. ;NOBYTES:DWORD = Number of bytes to allocate
  101. ;ADRPTR:DWORD = Far pointer to linear address of allocated block
  102. ;SIZEPTR:DWORD = Far pointer to size of allocated block
  103. ;HANDLEPTR:DWORD = Far pointer to handle of allocated block
  104. XMALLOC        PROC FAR,
  105.                ARG NOBYTES:DWORD,ADRPTR:DWORD,SIZEPTR:DWORD,HANDLEPTR:DWORD                         ;Number of bytes to allocate
  106.                PUSH           EBX
  107.                PUSH           ECX
  108.                PUSH           DS
  109.                MOV            EAX,NOBYTES
  110.                CALL           GETMEM
  111.                OR             EAX,EAX
  112.                JNZ            SHORT EXIT
  113.                PUSH           EBX
  114.                LDS            BX,ADRPTR
  115.                MOV            [BX],EDX
  116.                LDS            BX,SIZEPTR
  117.                MOV            [BX],ECX
  118.                LDS            BX,HANDLEPTR
  119.                POP            DWORD PTR [BX]
  120. EXIT:          PUSH           EAX                           ;Return error code in DX:AX
  121.                POP            AX
  122.                POP            DX
  123.                POP            DS
  124.                POP            ECX
  125.                POP            EBX
  126.                RET
  127. XMALLOC        ENDP
  128.  
  129. ;Release extended memory block.  Error code returned in DX:AX.  Arguments are:
  130. ;HANDLE:DWORD = Handle to previously allocated block
  131. XFREE          PROC FAR,
  132.                ARG HANDLE:DWORD                             ;Handle to previously allocated block
  133.                MOV            EAX,HANDLE
  134.                CALL           FREEMEM
  135.                PUSH           EAX                           ;Put error code in DX:AX
  136.                POP            AX
  137.                POP            DX
  138.                RET
  139. XFREE          ENDP
  140.  
  141. ;Allocate uncommitted extended memory block.  Error code returned in DX:AX.
  142. ;Arguments are:
  143. ;NOBYTES:DWORD = Number of bytes to allocate
  144. ;ADRPTR:DWORD = Far pointer to linear address of allocated block
  145. ;SIZEPTR:DWORD = Far pointer to size of allocated block
  146. ;HANDLEPTR:DWORD = Far pointer to handle of allocated block
  147. XUMALLOC       PROC FAR,
  148.                ARG NOBYTES:DWORD,ADRPTR:DWORD,SIZEPTR:DWORD,HANDLEPTR:DWORD                         ;Number of bytes to allocate
  149.                PUSH           EBX
  150.                PUSH           ECX
  151.                PUSH           DS
  152.                MOV            EAX,NOBYTES
  153.                CALL           GETUMEM
  154.                OR             EAX,EAX
  155.                JNZ            SHORT EXIT
  156.                PUSH           EBX
  157.                LDS            BX,ADRPTR
  158.                MOV            [BX],EDX
  159.                LDS            BX,SIZEPTR
  160.                MOV            [BX],ECX
  161.                LDS            BX,HANDLEPTR
  162.                POP            DWORD PTR [BX]
  163. EXIT:          PUSH           EAX                           ;Return error code in DX:AX
  164.                POP            AX
  165.                POP            DX
  166.                POP            DS
  167.                POP            ECX
  168.                POP            EBX
  169.                RET
  170. XUMALLOC       ENDP
  171.  
  172. ;Uncommit extended memory block.  Error code returned in DX:AX.  Arguments are:
  173. ;HANDLE:DWORD = Handle to previously allocated block
  174. ;STARTOFFSET:DWORD = Offset within block for first page to uncommit
  175. ;NOBYTES:DWORD = Number of bytes to uncommit
  176. XUNCOMMIT      PROC FAR,
  177.                ARG HANDLE:DWORD,STARTOFFSET:DWORD,NOBYTES:DWORD
  178.                PUSH           EBX
  179.                PUSH           ECX
  180.                MOV            EAX,HANDLE
  181.                MOV            EBX,STARTOFFSET
  182.                MOV            ECX,NOBYTES
  183.                CALL           UNCOMMITMEM
  184.                PUSH           EAX                           ;Put error code in DX:AX
  185.                POP            AX
  186.                POP            DX
  187.                POP            ECX
  188.                POP            EBX
  189.                RET
  190. XUNCOMMIT      ENDP
  191.  
  192. ;Map physical memory to logical address space.  Error code returned in DX:AX.
  193. ;Arguments are:
  194. ;PHYSADR:DWORD = Linear address of physical memory
  195. ;BLKSIZE:DWORD = Size of memory block (in bytes)
  196. ;LOGADRPTR:DWORD = Far pointer to DWORD to receive logical address
  197. MAPIOMEM       PROC FAR,
  198.                ARG PHYSADR:DWORD,BLKSIZE:DWORD,LOGADRPTR:DWORD
  199.                PUSH           BX
  200.                PUSH           DS
  201.                MOV            EDX,PHYSADR
  202.                MOV            EAX,BLKSIZE
  203.                PUSHD          OFFSET PMMAPIO
  204.                CALL           CALLPM
  205.                LDS            BX,LOGADRPTR
  206.                MOV            [BX],EDX
  207.                PUSH           EAX                           ;Place error code in DX:AX
  208.                POP            AX
  209.                POP            DX
  210.                POP            DS
  211.                POP            BX
  212.                RET
  213. MAPIOMEM       ENDP
  214.  
  215. ;Move memory.  This routine is suitable for interrupt handlers.  It uses a
  216. ;stack in DSEG rather than TSEG.  Arguments are:
  217. ;DESTADR:DWORD = Destination address.
  218. ;SOURCEADR:DWORD = Source address.
  219. ;NOBYTES:DWORD = Number of bytes to transfer.
  220.                ALIGN          16
  221. MOVMEM         PROC FAR,
  222.                ARG DESTADR:DWORD,SOURCEADR:DWORD,NOBYTES:DWORD
  223.                PUSHAD
  224.                PUSH           DS
  225.                PUSH           ES
  226.                PUSH           FS
  227.                PUSH           GS
  228.                MOV            AX,DSEG
  229.                MOV            DS,AX
  230.                MOV            ESI,SOURCEADR                 ;Load registers as required by MOVMEM32
  231.                MOV            EDI,DESTADR
  232.                MOV            ECX,NOBYTES
  233.                MOV            EDX,ISTKPTR                   ;Get currently available pointer for the dynamic stack
  234.                SUB            ISTKPTR,STKALLOC              ;Prepare dynamic stack for possibility of interrupt call back to this routine
  235.                MOV            BX,SP                         ;Save the old stack in EBX
  236.                PUSH           SS
  237.                PUSH           BX
  238.                POP            EBX
  239.                MOV            SS,AX                         ;Load the dynamic stack
  240.                MOV            ESP,EDX
  241.                CALL           SWITCHPM                      ;Switch to 16-bit protected mode
  242.                PUSHW          OFFSET RETADR                 ;PUSH return address for SWITCHRM
  243.                MOV            AX,CSEGSEL
  244.                PUSHW          0H                            ;PUSH 32-bit far return address back to SWITCHRM
  245.                PUSH           AX
  246.                PUSHD          OFFSET SWITCHRM
  247.                MOV            AX,TSEGSEL
  248.                PUSHW          0H                            ;PUSH 32-bit far address of MOVMEM32
  249.                PUSH           AX
  250.                PUSHD          OFFSET MOVMEM32
  251.                MOV            DS,FLATDSEL                   ;Switch to flat data model
  252.                DB             66H                           ;Execute 32-bit RETF
  253.                RETF
  254. RETADR:        PUSH           EBX                           ;Load calling stack
  255.                LSS            SP,[ESP]
  256.                ADD            ISTKPTR,STKALLOC              ;Adjust dynamic stack pointer
  257.                POP            GS
  258.                POP            FS
  259.                POP            ES
  260.                POP            DS
  261.                POPAD
  262.                RET
  263. MOVMEM         ENDP
  264.  
  265. ;Calculate linear address from segment address.  Call with segment address on
  266. ;stack.  Linear address returned in DX:AX.
  267. LINADR         PROC FAR,
  268.                ARG SEGADDRESS:DWORD                         ;Segment address of variable
  269.                MOV            AX,WORD PTR SEGADDRESS[2]     ;Do not corrupt high words (might be used in 16-bit interrupt handler)
  270.                XOR            DX,DX
  271.                SHLD           DX,AX,4
  272.                SHL            AX,4
  273.                ADD            AX,WORD PTR SEGADDRESS[0]
  274.                ADC            DX,0
  275.                RET
  276. LINADR         ENDP
  277.  
  278. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  279. ;Interfaces to XLIB file management routines.  Each of these procedures should
  280. ;be called with the segment address of the control block on the stack.  These
  281. ;routines cannot be called during interrupts since each routine calls DOS.
  282. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  283.  
  284. ;Create file.
  285. XFCREATE       PROC FAR
  286.                PUSHD          OFFSET PMXCREATE
  287.                JMP            CHAINTOPM
  288. XFCREATE       ENDP
  289.  
  290. ;Open file.
  291. XFOPEN         PROC FAR
  292.                PUSHD          OFFSET PMXOPEN
  293.                JMP            CHAINTOPM
  294. XFOPEN         ENDP
  295.  
  296. ;Close file.
  297. XFCLOSE        PROC FAR
  298.                PUSHD          OFFSET PMXCLOSE
  299.                JMP            CHAINTOPM
  300. XFCLOSE        ENDP
  301.  
  302. ;Load file
  303. XFLOAD         PROC FAR
  304.                PUSHD          OFFSET PMXLOAD
  305.                JMP            CHAINTOPM
  306. XFLOAD         ENDP
  307.  
  308. ;Save file.
  309. XFSAVE         PROC FAR
  310.                PUSHD          OFFSET PMXSAVE
  311.                JMP            CHAINTOPM
  312. XFSAVE         ENDP
  313.  
  314. ;Random read file.
  315. XFREAD         PROC FAR
  316.                PUSHD          OFFSET PMXREAD
  317.                JMP            CHAINTOPM
  318. XFREAD         ENDP
  319.  
  320. ;Random write file.
  321. XFWRITE        PROC FAR
  322.                PUSHD          OFFSET PMXWRITE
  323.                JMP            CHAINTOPM
  324. XFWRITE        ENDP
  325.  
  326. ;Transfer control to protected mode after converting segment address of control
  327. ;block to linear address in EAX.
  328. CHAINTOPM      PROC FAR
  329.                PUSH           DWORD PTR [ESP+8]             ;PUSH segment address of control block
  330.                CALL           LINADR
  331.                PUSH           DX
  332.                PUSH           AX
  333.                POP            EAX
  334.                CALL           CALLPM
  335.                RET            4
  336. CHAINTOPM      ENDP
  337.  
  338.                PUBLIC PASCAL XMALLOC
  339.                PUBLIC PASCAL XFREE
  340.                PUBLIC PASCAL XUMALLOC
  341.                PUBLIC PASCAL XUNCOMMIT
  342.                PUBLIC PASCAL MAPIOMEM
  343.                PUBLIC PASCAL LINADR
  344.                PUBLIC PASCAL MOVMEM
  345.                PUBLIC PASCAL XFCREATE
  346.                PUBLIC PASCAL XFOPEN
  347.                PUBLIC PASCAL XFCLOSE
  348.                PUBLIC PASCAL XFLOAD
  349.                PUBLIC PASCAL XFSAVE
  350.                PUBLIC PASCAL XFREAD
  351.                PUBLIC PASCAL XFWRITE
  352.  
  353. CSEG           ENDS
  354.  
  355. TSEG           SEGMENT PARA PUBLIC USE32 'CODE'
  356.                ASSUME CS:TSEG
  357.  
  358.                IF TASMMODE
  359.                LARGESTACK
  360.                ENDIF
  361.  
  362. ;Transfer memory.  Call with source address in ESI, destination address in EDI,
  363. ;and number of bytes to transfer in ECX.  Does not preserve registers.  This
  364. ;routine is far and is therefore a departure from XLIB policy.  This approach
  365. ;is used because the routine is not entered with the standard XLIB mode switch
  366. ;procedures, CALLPM and ENTERPM.  Standard mode switch procedures are not used
  367. ;because they are not reentrant and therefore cannot be used in interrupt
  368. ;handlers.
  369.                ALIGN          16
  370. MOVMEM32       PROC FAR
  371.                CMP            EDI,ESI
  372.                JBE            ENTERDN4
  373.                JMP            ENTERUP4
  374.                ALIGN          4
  375. UP4LOOP:       MOV            EAX,[ESI+1*ECX]               ;Destination address is higher than source address
  376.                MOV            [EDI+1*ECX],EAX
  377. ENTERUP4:      SUB            ECX,4
  378.                JAE            UP4LOOP
  379.                ADD            ECX,4
  380.                JNZ            ENTERUP1
  381.                RET
  382.                ALIGN          4
  383. UP1LOOP:       MOV            AL,[ESI+1*ECX]
  384.                MOV            [EDI+1*ECX],AL
  385. ENTERUP1:      DEC            ECX
  386.                JNS            UP1LOOP
  387.                RET
  388.                ALIGN          4
  389. DN4LOOP:       MOV            EAX,[ESI]                     ;Destination address is lower than source address
  390.                MOV            [EDI],EAX
  391.                ADD            ESI,4
  392.                ADD            EDI,4
  393. ENTERDN4:      SUB            ECX,4
  394.                JAE            DN4LOOP
  395.                ADD            ECX,4
  396.                JNZ            ENTERDN1
  397.                RET
  398.                ALIGN          4
  399. DN1LOOP:       MOV            AL,[ESI]
  400.                MOV            [EDI],AL
  401.                INC            ESI
  402.                INC            EDI
  403. ENTERDN1:      DEC            ECX
  404.                JNS            DN1LOOP
  405.                RET
  406. MOVMEM32       ENDP
  407.  
  408. TSEG           ENDS
  409.                END
  410.